package io.esirong.manager.region;

import android.content.Context;

/**
 *
 */
public final class RegionManager {

    /*
     *需要一个缓存类，管理类， 加载类
     */

    /**
     * 获取地址地区管理实例
     *
     * @param context 应用
     * @return 管理实例
     */
    public static RegionManager get(Context context) {
        return new RegionManager();
    }

    /**
     * 加载结果监听
     */
    public interface OnLoad {
        /**
         * 加载结果回调
         *
         * @param manager RegionManager
         * @param region  地址地区信息
         */
        void onResult(RegionManager manager, Region region);
    }

    /**
     * 设置加载时的配置信息
     *
     * @param opt 地址地区加配置类{@link Opt}
     * @return 管例实例
     */
    public RegionManager withOpt(Opt opt) {
        return this;
    }

    /**
     * 加载（可以调用并有回调的接口）
     */
    public void load() {
        load(null);
    }

    /**
     * 加载（可以调用并有回调的接口）
     *
     * @param load 回调接口
     */
    public void load(OnLoad load) {
        //制作一个任务切片，向外提供接口，加载数据的
        load(defaultOpt(), load);
    }

    private void load(Opt opt, OnLoad load) {

        //开启一个异步任务：从切片方法获取数据。获取成功则返回通知（做好缓存，方便使用）
        //1.异步检查内存
        try {
            execute();
            Region region = getRegionResult();
            if (region != null) {
                return;
            }
        } finally {
            //回调通知
            dispatchOnLoad();
        }


    }

    private void dispatchOnLoad() {

    }

    private void execute() {
    }

    private Region getRegionResult() {
        return null;
    }

    private Region fetchFromDisk() {
        return null;
    }

    private Region fetchFromMemory() {
        return null;
    }

    private Region fetchFromService() {
        return null;
    }
    
    /**
     * 配置项目，可以指定的，在准备加载会更好更快
     */
    public static class Opt {
        public String id;
        public String city;
        public String name;
        public String level;
        public String local;
    }

    /**
     * 创建默认的配置信息
     *
     * @return 配置信息
     */
    private Opt defaultOpt() {
        return new Opt();
    }
}
